using System;
using Csla;
using System.Data;
using Ent.AccesoDatos;
using System.Collections.Generic;
using System.Collections;
namespace Ent.Inscripcion.Core
{
    [Serializable]
    public class Usuario : BusinessBase<Usuario>
    {
        #region Business Methods

        private static PropertyInfo<Guid> IdProperty = RegisterProperty<Guid>(o => o.Id, "Name");
        public Guid Id
        {
            get { return GetProperty(IdProperty); }
            set { SetProperty(IdProperty, value); }
        }

        private static PropertyInfo<string> NombreProperty = RegisterProperty<string>(o => o.Nombre, "Name");
        public string Nombre
        {
            get { return GetProperty(NombreProperty); }
            set { SetProperty(NombreProperty, value); }
        }

        private static PropertyInfo<string> ApellidoProperty = RegisterProperty<string>(o => o.Apellido, "Name");
        public string Apellido
        {
            get { return GetProperty(ApellidoProperty); }
            set { SetProperty(ApellidoProperty, value); }
        }

        private static PropertyInfo<string> LoginProperty = RegisterProperty<string>(o => o.Login, "Name");
        public string Login
        {
            get { return GetProperty(LoginProperty); }
            set { SetProperty(LoginProperty, value); }
        }

        private static PropertyInfo<string> ClaveProperty = RegisterProperty<string>(o => o.Clave, "Name");
        public string Clave
        {
            get { return GetProperty(ClaveProperty); }
            set { SetProperty(ClaveProperty, value); }
        }

        private static PropertyInfo<string> MailProperty = RegisterProperty<string>(o => o.Mail, "Name");
        public string Mail
        {
            get { return GetProperty(MailProperty); }
            set { SetProperty(MailProperty, value); }
        }

       

        public static bool VerificarLogin(string Usuario)
        {
            return ExisteUsuarioCommand.Execute(Usuario);
        }

        #endregion

        #region Validation Rules

        protected override void AddBusinessRules()
        {
            // TODO: add validation rules
            //ValidationRules.AddRule(RuleMethod, "");
        }

        #endregion

        #region Factory Methods

        public static Usuario NewUsuario()
        {
            return DataPortal.Create<Usuario>();
        }

        public static Usuario GetUsuario(Guid id)
        {
            return DataPortal.Fetch<Usuario>(
              new SingleCriteria<Usuario, Guid>(id));
        }

        public static Usuario GetUsuario(string login)
        {
            return DataPortal.Fetch<Usuario>(
              new SingleCriteria<Usuario, string>(login));
        }

        public static void DeleteUsuario(Guid id)
        {
            DataPortal.Delete<Usuario>(new SingleCriteria<Usuario, Guid>(id));
        }

        private Usuario()
        {
            LoadProperty(IdProperty,Guid.NewGuid());
        }

        #endregion

        #region Data Access

        [RunLocal]
        protected override void DataPortal_Create()
        {
            // TODO: load default values
            // omit this override if you have no defaults to set
            base.DataPortal_Create();
        }

        private void DataPortal_Fetch(SingleCriteria<Usuario, Guid> criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro> {new Parametro("Id", criteria.Value), new Parametro("Login", "")};
            var datos = accesoDatos.EjecutarReader("ConsultarUsuario", parametros);
            if (datos.Datos.Read())
            {
                LoadProperty(IdProperty, Guid.Parse(datos.Datos.GetString(0)));
                LoadProperty(NombreProperty, datos.Datos.GetString(1));
                LoadProperty(ApellidoProperty, datos.Datos.GetString(2));
                LoadProperty(LoginProperty, datos.Datos.GetString(3));
                LoadProperty(ClaveProperty, datos.Datos.GetString(4));
                LoadProperty(MailProperty, datos.Datos.GetString(5));
            }
            if (!datos.Datos.IsClosed) datos.Datos.Close();
        }

        private void DataPortal_Fetch(SingleCriteria<Usuario, string> criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro> {new Parametro("Id", ""), new Parametro("Login", criteria.Value)};
            var datos = accesoDatos.EjecutarReader("ConsultarUsuario", parametros);
            if (datos.Datos.Read())
            {
                LoadProperty(IdProperty, Guid.Parse(datos.Datos.GetString(0)));
                LoadProperty(NombreProperty, datos.Datos.GetString(1));
                LoadProperty(ApellidoProperty, datos.Datos.GetString(2));
                LoadProperty(LoginProperty, datos.Datos.GetString(3));
                LoadProperty(ClaveProperty, datos.Datos.GetString(4));
                LoadProperty(MailProperty, datos.Datos.GetString(5));
            }
            if (!datos.Datos.IsClosed) datos.Datos.Close();
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Insert()
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro>
                                 {
                                     new Parametro("Nombre", ReadProperty(NombreProperty)),
                                     new Parametro("Apellido", ReadProperty(ApellidoProperty)),
                                     new Parametro("Email", ReadProperty(MailProperty)),
                                     new Parametro("Login", ReadProperty(LoginProperty)),
                                     new Parametro("Password", ReadProperty(ClaveProperty)),
                                     new Parametro("Id", ReadProperty(IdProperty))
                                 };
            accesoDatos.EjecutarQuery("InsertarUsuario", parametros);
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Update()
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro>
                                 {
                                     new Parametro("Nombre", ReadProperty(NombreProperty)),
                                     new Parametro("Apellido", ReadProperty(ApellidoProperty)),
                                     new Parametro("Email", ReadProperty(MailProperty)),
                                     new Parametro("Login", ReadProperty(LoginProperty)),
                                     new Parametro("Password", ReadProperty(ClaveProperty)),
                                     new Parametro("Id", ReadProperty(IdProperty))
                                 };
            accesoDatos.EjecutarQuery("ActualizarUsuario", parametros);
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_DeleteSelf()
        {
            DataPortal_Delete(new SingleCriteria<Usuario, Guid>(ReadProperty(IdProperty)));
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        private void DataPortal_Delete(SingleCriteria<Usuario, Guid> criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro> {new Parametro("Id", criteria.Value)};
            accesoDatos.EjecutarQuery("EliminarUsuario", parametros);
        }

        #endregion
    }

    [Serializable]
    public class ExisteUsuarioCommand : CommandBase<ExisteUsuarioCommand>
    {
        private string _usuario;

        #region Authorization Methods

        public static bool CanExecuteCommand()
        {
            // TODO: customize to check user role
            //return Csla.ApplicationContext.User.IsInRole("Role");
            return true;
        }

        #endregion

        #region Factory Methods

        public static bool Execute(string usuario)
        {
            if (!CanExecuteCommand())
                throw new System.Security.SecurityException("Not authorized to execute command");

            ExisteUsuarioCommand cmd = new ExisteUsuarioCommand(usuario);
            cmd.BeforeServer();
            cmd = DataPortal.Execute<ExisteUsuarioCommand>(cmd);
            cmd.AfterServer();
            return cmd.Result;
        }

        private ExisteUsuarioCommand(string usuario)
        { /* require use of factory methods */
            _usuario = usuario;
            _result = false;
        }

        #endregion

        #region Client-side Code

        // TODO: add your own fields and properties
        bool _result;

        public bool Result
        {
            get { return _result; }
        }

        private void BeforeServer()
        {
            // TODO: implement code to run on client
            // before server is called
        }

        private void AfterServer()
        {
            // TODO: implement code to run on client
            // after server is called
        }

        #endregion

        #region Server-side Code

        protected override void DataPortal_Execute()
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro> {new Parametro("Login", _usuario)};
            var datos = accesoDatos.EjecutarScalar("VerificarUsuario", parametros);
            int numeroUsuario;
            int.TryParse(datos.ToString(), out numeroUsuario);
            if (numeroUsuario == 0)
                _result = false;
            else
                _result = true;
        }

        #endregion
    }
}
